package com.example.springDemo.controller;

import com.example.springDemo.bean.Pet;
import com.example.springDemo.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class ResponseTestController {

    /**
     * Message Converter//消息转换器
     * ● 1、返回值处理器判断是否支持这种类型返回值 supportsReturnType
     * ● 2、返回值处理器调用 handleReturnValue 进行处理
     * ● 3、RequestResponseBodyMethodProcessor 可以处理返回值标了@ResponseBody 注解的。
     *   ○ 1.  利用 MessageConverters 进行处理 将数据写为json
     *     ■ 1、内容协商（浏览器默认会以请求头的方式告诉服务器他能接受什么样的内容类型）
     *          请求头中Accept字段。Http协议中规定的，告诉服务器本客户端可以接收的数据类型。
     *          ● 支持 将对象转为 最佳匹配媒体类型 的converter。调用它进行转化 。
     *     ■ 2、服务器最终根据自己自身的能力，决定服务器能生产出什么样内容类型的数据，
     *     ■ 3、SpringMVC会挨个遍历所有容器底层的 HttpMessageConverter ，看谁能处理？
     *       ● 1、得到MappingJackson2HttpMessageConverter可以将对象写为json
     *       ● 2、利用MappingJackson2HttpMessageConverter将对象转为json再写出去。
     *
     * 它会根据 浏览器的请求头（有转换权重   权重大的优先）
     *    如果浏览器  想要自定义 想要什么  就要什么  可以开启基于参数的内容协商 （在配置文件中）
     *      spring:mvc:contentnegotiation:favor-parameter:true  true  开启
     *      在网址中加？http://localhost:8080/test/user?format=  json/xml
     *
     * 在maven里添加一个xml  依赖   如果浏览器的请求头xml优先级高   就会优先转换成xml
     *
     */
    /**
     * 自定义Message Converter
     * 浏览器发请求直接返回xml              【application/xml】
     * 如果是ajax请求返回json              【application/json】
     * 如果自定义app发请求，返回自定义协议数据   【application/x-long】
     *
     *
     */
    @ResponseBody//会给前端自动返回JSON数据!利用返回值处理器里面的消息转换器进行处理
    @GetMapping("/test/user")
    public User getUser(){
        User user = new User();
        user.setAge(23);
        user.setName("周杰伦");
        user.setPet(new Pet("宠物",60.5));
        return user;

    }
}
